/**
 * @file      isys.h
 * @copyright Copyright (c) 2020, ZCW Co., Ltd. All Rights Reserved.
 * @brief     brief
 * @author    caiwang213@qq.com
 * @date      2020-05-15 23:53:09
 *
 * @note
 *  isys.h defines
 */
#ifndef __ISYS_H__
#define __ISYS_H__
#include "os.h"
#include <string>
#include <vector>
using namespace std;

namespace log4x
{

typedef struct
{
    string             computer_name;                      /**< 计算机名称 */
    string             computer_user;                      /**< 计算机用户 */
    string             computer_domain;                    /**< 计算机域 */
    string             name;                               /**< 操作系统名称 */
    string             arch;                               /**< 硬件架构 */
    string             version;                            /**< 操作系统版本 */
} sys_info_s;

typedef struct
{
    string             vendor;                             /**< mem的供应商 */
    string             model;                              /**< cpu的类别 */
    int                mhz;                                /**< cpu的主频（单位：MHZ）*/
    uint32_t           cache_size;                         /**< 缓冲存储器数量 */
    int                total_sockets;                      /**< cpu Sockets插槽总数 */
    int                total_cores;                        /**< cpu内核总数 */
    int                cores_per_socket;                   /**< 每个cpu插槽核数/每颗物理cpu核数 */
} cpu_info_s;

typedef struct
{
    string             vendor;                             /**< 生产厂商 */
    int                size;                               /**< 内存大小, 单位: GB */
    int                generation;                         /**< 第几代 */
    int                mhz;                                /**< 频率, 单位: MHz*/
} mem_info_s;

typedef struct
{
    uint64_t           total;                              /**< 物理内存总量, 单位: kbyte */
    uint64_t           used;                               /**< 已使用内存总量, 单位: kbyte */
    uint64_t           free;                               /**< 剩余内存总量, 单位: kbyte */
    uint64_t           cached;                             /**< 缓存内存总量, 单位: kbyte */
    uint64_t           actual_used;                        /**< 实际使用内存总量, 单位: kbyte */
    uint64_t           actual_free;                        /**< 实际空闲内存总量, 单位: kbyte */
    double             used_percent;                       /**< 已经使用内存百分比 */
    double             free_percent;                       /**< 剩余内存百分比 */
} mem_stat_s;

typedef struct
{
    string             ifname;
    string             hwaddr;
    string             type;
    string             uuid;
    string             ipv4;
    string             ipv6;
    string             mask;
    string             dns;
} net_info_s;

typedef struct
{
    uint64_t           speed;                              /**< 网卡速度, 单位: Mbit */
    /* received */
    uint64_t           rx_packets;                         /**< 接收总包数 */
    uint64_t           rx_bytes;                           /**< 接收总字节数 */
    uint64_t           rx_errors;                          /**< 接收总错误包数 */
    uint64_t           rx_dropped;                         /**< 接收总丢弃包数 */
    double             rx_speed;                           /**< 接收速度, 单位: kb/s */

    /* transmitted */
    uint64_t           tx_packets;                         /**< 发送总包数 */
    uint64_t           tx_bytes;                           /**< 发送总字节数 */
    uint64_t           tx_errors;                          /**< 发送总错误包数 */
    uint64_t           tx_dropped;                         /**< 发送总丢弃包数 */
    double             tx_speed;                           /**< 发送速度, kb/s */

    double             percent;                            /**< 网络利用率 */
} net_stat_s;

typedef struct
{
    string             vendor;                             /**< 生产厂商 */
    int                size;                               /**< 存储大小, 单位: GB */
    int                rpm;                                /**< 转数 */
} hdd_info_s;

typedef struct
{
    string             format;                             /**< NTFS/FAT32/EXT3/EXT4 */
    uint64_t           total;                              /**< 硬盘总大小, 单位: kbyte */
    uint64_t           used;                               /**< 已经使用总量, 单位: kbyte */
    uint64_t           free;                               /**< 剩余总量, 单位: kbyte */
    double             used_percent;                       /**< 已经使用内存百分比 */
    double             free_percent;                       /**< 剩余内存百分比 */
} hdd_stat_s;

class isys
{
public:
    virtual int        hdd_info(hdd_info_s& info) = 0;
    virtual int        hdd_stat(const string& path, hdd_stat_s& stat) = 0;

protected:
    virtual ~isys() {}
};

}
#endif
